#define _SVID_SOURCE 1        /* Requerido por algunos gcc */
#include <stdio.h>
#include <stdlib.h>
#include <limits.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/ipc.h>
#include <sys/sem.h>
#include <sys/stat.h>
#include <unistd.h>
#include <time.h>
#include <fcntl.h>
#include <signal.h>
#include <sys/shm.h>
#include <errno.h>
#include <string.h>
#include </root/Desktop/semaforos.h>

#define TRUE 1
#define FALSE 0

#define TICKET_FILE "ticket.txt"		/* Archivo donde guardo el ultimo numero de ticket */


int getTicketNumber(int semid) {

 int ticketnumber;
 int newticketnumber;
 char msj[50];
 FILE *file;

  p(semid);

/* Ocupo el semaforo */

 /*
  * Abro el archivo para poder leerlo
  */
  file = fopen(TICKET_FILE, "r");
  if (file == NULL){
	return -1;
  }

  fscanf(file, "%d", &ticketnumber);		/* Obtengo el numero ultimo numero de ticket del archivo */
  newticketnumber = ticketnumber + 1;		/* Incremento el numero */

  fclose(file);

	sprintf(msj,"Duermo 20 segundos\n");
	write(fileno(stdout), msj, strlen(msj));


  //printf("Duermo 20 segundos ...");
  /* BORRAR */
  sleep(20);

 /*
  * Abro el archivo para poder escribirlo
  */
  file = fopen(TICKET_FILE, "w");
  if (file == NULL){
        return -1;
  }

  fprintf(file, "%d", newticketnumber);
  fclose(file);

  v(semid);					/* Libero el semaforo */

   return ticketnumber;
}

/*
 * main()
 */
int main() {

 int semidticket, ticketnumber;
 int idsem = 1;				/* El id que uso para crear el o identificar el semaforo */
 char msj[50];
 /*
  * Obtengo el numero de ticket y le paso el semid para poder frenar el semaforo
  */

	/* Si el semaforo ya esta creado adquiro los derechos y el numero de semaforo */
	semidticket = getsem(idsem);
	if (semidticket == -1)
	{
		sprintf(msj,"Error al adquirir derechos sobre el semaforo");
		write(fileno(stdout), msj, strlen(msj));		
	}
 	else 
	{
	/* Si el semaforo no habia sido creado, lo inicializo */
		if (inisem(semidticket, TRUE) == -1)
		{
			sprintf(msj,"Error al inicializar el semaforo: %d", semidticket);
			write(fileno(stdout), msj, strlen(msj));
        		exit(1);
		}
		sprintf(msj,"Semaforo ID: %d\n", semidticket);
		write(fileno(stdout), msj, strlen(msj)); 
	}
	
	ticketnumber = getTicketNumber(semidticket);

	if ( ticketnumber == -1 )
	{
		sprintf(msj,"Error al abrir el archivo: %s\n", TICKET_FILE);
		write(fileno(stdout), msj, strlen(msj)); 	
	}
	else
	{
		sprintf(msj,"El numero de ticket es: %d\n", ticketnumber);
		write(fileno(stdout), msj, strlen(msj)); 		
	}

 
/* Salgo de la aplicacion, borro los semaforos */
 //elisem(semidticket);

 return 0;
}
